package com.sky.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.sky.dto.SetmealDTO;
import com.sky.dto.SetmealPageQueryDTO;
import com.sky.entity.Setmeal;
import com.sky.entity.SetmealDish;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealDishMapper;
import com.sky.mapper.SetmealMapper;
import com.sky.result.PageResult;
import com.sky.service.SetMealService;
import com.sky.vo.DishItemVO;
import com.sky.vo.SetmealVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @author 贾育权~
 * @version 1.0
 */
@Service
public class SetMealServiceIml  implements SetMealService {

    @Autowired
    private SetmealMapper setmealMapper;
    @Autowired
    private SetmealDishMapper setmealDishMapper;
    @Autowired
    private DishMapper dishMapper;

    /**
     * 新增套餐，同时需要保存套餐和菜品的关联关系//我们新增的套餐我们要插入它说包含的菜品
     * @param setmealDTO
     */
    @Transactional
    public void saveWithDish(SetmealDTO setmealDTO) {
        Setmeal setmeal = new Setmeal();
        BeanUtils.copyProperties(setmealDTO, setmeal);

        //向套餐表插入数据//想套餐表里面插入数据
        setmealMapper.insert(setmeal);

        //获取生成的套餐id//通过间接的方式得到套餐id
        Long setmealId = setmeal.getId();

        List<SetmealDish> setmealDishes = setmealDTO.getSetmealDishes();//套餐里面包含的菜品，
        // 然而就是我们包含的菜品的对应的套餐的id 没有我们就要给它遍历赋值 然后插入到数据库里面
        setmealDishes.forEach(setmealDish -> {
            setmealDish.setSetmealId(setmealId);
        });
        //保存套餐和菜品的关联关系//批量插入套餐和菜品的关联关系//批量插入
        setmealDishMapper.insertBatch(setmealDishes);
    }

    @Override
    public PageResult pageQuery(SetmealPageQueryDTO setmealPageQueryDTO) {
        //构建分页查询对象 //分页查询
        PageHelper.startPage(setmealPageQueryDTO.getPage(),setmealPageQueryDTO.getPageSize());//跟那个limit关键字一起使用 //
        Page<SetmealVO> page = setmealMapper.pageQuery(setmealPageQueryDTO);//分页查询就是帮助我们去分页的
        return new PageResult(page.getTotal(),page.getResult());



    }

    @Override
    public void deleteById(List<Long> ids) {//批量删除套餐
//        for (Long id : ids) {
//            Setmeal setmeal = setmealMapper.getById(id);
//            Integer status = setmeal.getStatus();
//            if(status==1){
//                //起售中的套餐不能删除
//                throw new RuntimeException("起售中的套餐不能删除");
//            }
//        }
        for(Long id:ids){//遍历每一个id
            Setmeal setmeal = setmealMapper.getById(id);
            Integer status = setmeal.getStatus();
            if(status==1){
                throw new RuntimeException("起售中的套餐不能删除");
            }



        }
        setmealMapper.deleteBatchById(ids);
        //根据id删除套餐表和菜品关联表的数据（）////
        setmealDishMapper.deleteBatchBySetmealId(ids);

    }

    @Override
    public void deleteById(Long id) {
        setmealMapper.deleteById(id);
        //根据id删除套餐表和菜品关联表的数据（）
        setmealDishMapper.deleteBySetmealId(id);


    }
//通过id查询套餐数据
    @Override
    public SetmealDTO getByIdWithDish(Long id) {
        SetmealVO setmealVO = setmealMapper.getByIdWithDish(id);
        SetmealDTO setmealDTO = new SetmealDTO();//VO 转化为DTO //从数据库里面查询到的数据往往是比较多的，
        // 然后我们就会做一个处理与筛选转换的操作

        BeanUtils.copyProperties(setmealVO,setmealDTO);

        return setmealDTO;

    }

    @Override
    public void update(SetmealDTO setmealDTO) {//进行套餐的修改的操作
        Setmeal setmeal = new Setmeal();
        BeanUtils.copyProperties(setmealDTO,setmeal);
        setmealMapper.update(setmeal);

        //先删除套餐表中的数据，再添加套餐表中的数据
        Long setmealId = setmealDTO.getId();
        setmealDishMapper.deleteBySetmealId(setmealId);

        //组装SetmealDish数据，数据是菜品数据，也就是套餐里面包含的菜品数据
        List<SetmealDish> setmealDishes = setmealDTO.getSetmealDishes();
        setmealDishes.forEach(setmealDish -> {
            setmealDish.setSetmealId(setmealId);
        });
        //插入套餐和菜品的关联关系数据
        setmealDishMapper.insertBatch(setmealDishes);
        //但是和数据库打交道的实体对象是VO 类型的
//        SetmealVO setmealVO = new SetmealVO();
//        BeanUtils.copyProperties(setmealDTO,setmealVO);//有些字段是空的
//        setmealMapper.update(setmealVO);


    }

    @Override
    public void startOrStop(Integer status, Long id) {//修改某个套餐的起售停售状态我们要update操作
        //我们要构建一个setmeal对象，如果传进去的值为空的话我们就是不再更新这个字段
        Setmeal setmeal = Setmeal.builder()
                .id(id)
                .status(status)
                .build();//其他对应的属性字段是为空的也就是没有值
        setmealMapper.update(setmeal);

    }

    @Override

        public List<Setmeal> list(Setmeal setmeal) {
            List<Setmeal> list = setmealMapper.list(setmeal);
            return list;
        }


    @Override
    public List<DishItemVO> getDishItemById(Long id) {
        return setmealMapper.getDishItemBySetmealId(id);
    }

}
